package avicit.bdp.dgs.qa.dao;

import avicit.bdp.common.base.BaseDAO;
import avicit.bdp.dgs.qa.dto.JobReportDTO;
import avicit.bdp.dgs.qa.dto.MetricDTO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * @金航数码科技有限责任公司
 * @作者：developer
 * @邮箱：developer@avic-digital.com
 * @创建时间： 2023-07-17
 * @类说明：JobReportDAO
 * @修改记录：
 * @注意事项：
 * @主要功能：质量报告DAO
 */
@Repository
public interface JobReportDAO extends BaseDAO<JobReportDTO> {
    /**
     * 查看详情
     *
     * @param jobId             作业ID
     * @param processInstanceId 流程实例ID
     * @return
     */
    JobReportDTO getJobReportDetail(@Param("jobId") String jobId, @Param("processInstanceId") String processInstanceId);

    /**
     * 删除/批量删除质量报告
     * 注意：
     * 1、删除历史任务（流程实例）时，单个/批量删除质量报告
     * 2、删除质量作业时，删除作业关联的所有质量报告
     *
     * @param jobId  作业ID
     * @param idList 流程实例ID列表
     * @return
     */
    int deleteJobReportByCond(@Param("jobId") String jobId, @Param("idList") List<String> idList);

    /**
     * 统计质量告警次数（仅针对运行成功的 && 有告警的质量作业）
     *
     * @return
     */
    long countJobAlert(@Param("startTime") String startTime,
                       @Param("endTime") String endTime,
                       @Param("wordSecretList") List<String> wordSecretList);

    /**
     * 统计指定时间内的告警任务总数（去重）
     *
     * @param type
     * @param startTime
     * @param endTime
     * @return
     */
    long countJobAlertByCond(@Param("type") Integer type, @Param("startTime") String startTime, @Param("endTime") String endTime);

    /**
     * 根据分数统计作业评估数目,[minScore,maxScore)
     *
     * @param minScore
     * @param maxScore
     * @param startTime
     * @param endTime
     * @return
     */
    long countJobByScore(@Param("minScore") Integer minScore, @Param("maxScore") Integer maxScore,
                         @Param("startTime") String startTime, @Param("endTime") String endTime,
                         @Param("wordSecretList") List<String> wordSecretList);

    /**
     * 查看质量评分排名
     *
     * @param rankMode  排名方式，0：排名最高、1：排名最低"
     * @param limitNum  排名限制
     * @param startTime
     * @param endTime
     * @return
     */
    List<JobReportDTO> getReportListByScore(@Param("rankMode") Integer rankMode, @Param("limitNum") Integer limitNum,
                                            @Param("startTime") String startTime, @Param("endTime") String endTime,
                                            @Param("wordSecretList") List<String> wordSecretList);

    /**
     * 查看近24小时每小时评分的平均值
     *
     * @param condList 查询条件，{[startTime,endTime]...}
     * @return
     */
    List<MetricDTO> getLast24hScoreAvg(@Param("condList") List<MetricDTO> condList,
                                       @Param("wordSecretList") List<String> wordSecretList);

    /**
     * 查看近24小时每小时告警总数
     *
     * @param condList 查询条件，{[startTime,endTime]...}
     * @return
     */
    List<MetricDTO> getLast24hAlertNum(@Param("condList") List<MetricDTO> condList,
                                       @Param("wordSecretList") List<String> wordSecretList);

    /**
     * 查看近7天每天评分的平均值
     *
     * @return
     */
    List<MetricDTO> getLast7DaysScoreAvg(@Param("wordSecretList") List<String> wordSecretList);

    /**
     * 查看近30天每天评分的平均值
     *
     * @return
     */
    List<MetricDTO> getLast30DaysScoreAvg(@Param("wordSecretList") List<String> wordSecretList);

    /**
     * 查看本月每天评分的平均值
     *
     * @param condList
     * @return
     */
    List<MetricDTO> getMonthScoreAvg(@Param("condList") List<String> condList,
                                     @Param("wordSecretList") List<String> wordSecretList);

    /**
     * 查看近7天每天告警总数
     *
     * @return
     */
    List<MetricDTO> getLast7DaysAlertNum(@Param("wordSecretList") List<String> wordSecretList);

    /**
     * 查看近30天每天告警总数
     *
     * @return
     */
    List<MetricDTO> getLast30DaysAlertNum(@Param("wordSecretList") List<String> wordSecretList);

    /**
     * 查看本月每天告警数
     *
     * @param condList
     * @return
     */
    List<MetricDTO> getMonthAlertNum(@Param("condList") List<String> condList,
                                     @Param("wordSecretList") List<String> wordSecretList);
}
